在上一篇有提到如何以LINEBOT接收圖片,
並且進行灰階處理與二值化後再回傳給user,
這麼做能夠產生什麼用途呢?
這邊跟大家介紹關於圖像邊緣特徵偵測的一個簡易方法,
即運用opencv的findContours(),抓取二值化後的圖片輪廓,
首先前情提要一下,在進行灰階處理及二值化的時候,
過程式由三通道的RGB彩色圖片先轉為單通道的灰階圖,
然後再以臨界值(threshold),將圖片轉為0(黑色)或255(白色)二值化的圖,
而二值化的臨界值,可以從以下參數做設定:
#這裡的127即為二值化的臨界值,127以上二值化為白色,不足則二值化為黑色
ret,binary=cv.threshold(gray,127,255,cv.THRESH_BINARY)
因此在二值化的過程中,可以調整此臨界值以取得圖片中不同黑白分布的圖片,
以下將團隊LOGO作為舉例:
在上面的範例當中,羊的圖片就不見了,
原因是在灰階圖片當中,羊的灰階數值是大於127的,
若要將羊保留為圖片中黑色部分,則我們可將臨界值調整至200,
#將臨界值調整至200,以保留較淺色區域
ret,binary=cv.threshold(gray,200,255,cv.THRESH_BINARY)
這樣一來羊就被保留住囉~
當我們獲得一個二值化圖片之後,
可以透過這個圖片來描繪出畫面中黑白間隔所組成的輪廓,
#image_processing.py
#將二值化的圖片放到
contours,hierarchy = cv.findContours(binary,cv.RETR_LIST,cv.CHAIN_APPROX_SIMPLE)
#首先複製原圖
copy = img.copy()
#將輪廓描繪在複製圖上
copy = cv.drawContours(copy,contours,-1,(255,0,0),2)
#將複製圖存實體檔案
contour_image_path = './static/contour.png'
cv.imwrite(contour_image_path,copy)
return contour_image_path
透過findContours()獲得的contours,
是一個由好幾個contour組成的list,
每個contour則是由多個座標點組成,
而drawContours()則是將輪廓繪製出來的函數,
介紹一下當中的參數,
第一個是要當底圖的圖片,第二個是要繪出的輪廓集,
第三個參數代表的是指定要繪出輪廓集當中的第幾個輪廓,若-1則是代表全部,
第四個參數跟第五個參數,分別代表繪製輪廓的線條顏色(B,G,R)跟粗細,
由上圖將contours繪畫至複製的原圖上,
所呈現的畫面會是如此:
如果只想要看輪廓的樣子,可以用numpy的ones建立一個空白圖片,
#image_process.py
import numpy
#建立空白圖片
empty = np.ones(img.shape,dtype=np.uint8)*255
#將輪廓描繪在複製圖上
copy = cv.drawContours(empty,contours,-1,(255,0,0),2)
這樣一來就能將contours套在各種底圖上囉,